# api/utils.py
import re
import logging
from datetime import datetime

from django.core.exceptions import ObjectDoesNotExist
from .models import UserProfile

# 配置日志
logger = logging.getLogger(__name__)

# 正则表达式：匹配"为[用户名]推荐..."格式中的用户名
USERNAME_PATTERN = re.compile(r'为([\u4e00-\u9fa5a-zA-Z0-9_]+)推荐', re.IGNORECASE)


def extract_username(user_query: str) -> str:
    """
    从用户查询中提取用户名，支持多种格式

    Args:
        user_query: 用户输入的查询字符串

    Returns:
        提取到的用户名，若未匹配则返回None
    """
    if not user_query:
        return None

    # 格式1: "为[用户名]推荐..."
    match1 = USERNAME_PATTERN.search(user_query)
    if match1:
        username = match1.group(1)
        logger.info(f"从查询中提取到用户名（格式1）：{username}")
        return username
    
    # 格式2: "为[用户名]：[内容]"
    match2 = re.search(r'为([\u4e00-\u9fa5a-zA-Z0-9_]+)：', user_query)
    if match2:
        username = match2.group(1)
        logger.info(f"从查询中提取到用户名（格式2）：{username}")
        return username
    
    # 格式3: "我是[用户名]"
    match3 = re.search(r'我是([\u4e00-\u9fa5a-zA-Z0-9_]+)', user_query)
    if match3:
        username = match3.group(1)
        logger.info(f"从查询中提取到用户名（格式3）：{username}")
        return username
    
    # 格式4: "我叫[用户名]"
    match4 = re.search(r'我叫([\u4e00-\u9fa5a-zA-Z0-9_]+)', user_query)
    if match4:
        username = match4.group(1)
        logger.info(f"从查询中提取到用户名（格式4）：{username}")
        return username

    logger.warning(f"无法从查询中提取用户名：{user_query}")
    return None


def generate_prompt(username: str, user_query: str, history: str) -> str:
    """
    生成LLM提示词

    Args:
        username: 用户名
        user_query: 用户当前查询
        history: 历史对话记录

    Returns:
        生成的提示词字符串
    """
    try:
        # 查询用户信息
        user = UserProfile.objects.get(username=username)

        # 构建提示词
        prompt = f"""你是专业的穿搭推荐顾问，需要根据以下信息为用户提供个性化穿搭建议：

用户基本信息：
- 姓名：{user.username}
- 性别：{user.gender}
- 年龄：{user.age}岁
- 爱好：{user.hobby}
- 身高/体重：{user.height}cm / {user.weight}kg
- 日常习惯：{user.behavior_habit}

历史对话参考（避免重复推荐）：
{history if history else "无历史对话"}

当前用户需求：
{user_query}

推荐要求：
1. 结合用户性别、年龄和身材特点
2. 考虑用户爱好和日常习惯
3. 明确说明推荐的场景适配性
4. 分品类推荐（上衣、裤子/裙子、鞋子、配饰等）
5. 给出搭配理由和风格说明
6. 语言简洁易懂，避免专业术语过多
"""
        logger.info(f"为用户{username}生成提示词成功")
        return prompt

    except ObjectDoesNotExist:
        error_msg = f"未找到用户「{username}」的信息，请先完善用户资料"
        logger.warning(error_msg)
        return error_msg
    except Exception as e:
        error_msg = f"生成提示词失败：{str(e)}"
        logger.error(error_msg)
        return error_msg


def save_chat_history(username: str, user_query: str, response: str, redis_conn) -> None:
    """
    保存对话历史到Redis

    Args:
        username: 用户名
        user_query: 用户查询
        response: LLM响应
        redis_conn: Redis连接对象
    """
    try:
        history_key = f"user:chat:{username}"
        timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        # 构建对话记录
        chat_record = f"[{timestamp}] 用户：{user_query}\n[{timestamp}] 助手：{response}\n\n"
        # 追加到Redis
        redis_conn.append(history_key, chat_record)
        # 设置过期时间（30天）
        redis_conn.expire(history_key, 60 * 60 * 24 * 30)
        logger.info(f"已保存用户{username}的对话历史")
    except Exception as e:
        logger.error(f"保存对话历史失败：{str(e)}")
